package com.study.d2_lambda;

public class Test {
    public static void main(String[] args) {
        //了解lambda表达式是如何简化匿名内部类的,lambda表达式是JDK 8开始新增的一种语法形式
        Animal animal = new Animal() {
            @Override
            void run() {
                System.out.println("🐅跑得快！");
            }
        };
            animal.run();


            //Lambda表达式只能简化函数式接口的匿名内部类！
            //函数式接口：有且仅有一个抽象方法的接口
            //注意：将来见到的大部分函数式接口，上面都会有一个@Functionallnterface的注解，有该注解必定就是函数式接口
            Swimming sw = new Swimming() {
                @Override
                public void swim() {
                    System.out.println("游泳！！！");
                }
            };
            sw.swim();

            //lambda可以上下文推断出真实的代码形式
/*        Swimming sw2 = () ->{
                System.out.println("lambda游泳！！！");
        };
        sw2.swim();*/
        //lambda进一步简化写法
        //参数类型可以省略不写
        //如果只有一个参数，参数类型可以省略，同时()也可以省略
        //如果lambda表达式中的方法体代码只有一行，可以省略大括号不写，同时要省略分号！如果这行代码是return语句，也必须去掉return不写
        Swimming sw2 = () ->System.out.println("lambda游泳！！！");
        sw2.swim();
    }
}

abstract class Animal{
   abstract void run();
}

@FunctionalInterface//函数式接口中有且仅有一个抽象方法
interface Swimming{
    void swim();
}